#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>

//declaracao de escopos
int palindromo(char *palavra); // calcula se a palavra e um palindromo
int calcula_primo(char *palavra);

//variaveis globais
int count2=0;

int main(){
   
   FILE *fp,*fp1;
   char c,cc[2],frase[10000],palavra[30];
   int flag,tam,i,aux;
   int aux_palin,aux_primo;
   int tamanho_arquivo;
   
   fp = fopen("wikipedia.txt","r");
   
   //caso o arquivo nao exita
   if(fp == NULL)
       perror("Erro ao abrir o arquivo...\n");
   
   //pegando o tamanho do arquivo  
   fseek(fp,0,SEEK_END);
   tamanho_arquivo = ftell(fp);     
   rewind(fp);    
   
   //inicializando variaveis
   strcpy(frase,"");
   strcpy(palavra,"");
   strcpy(cc,"");
   flag = 0;
   
   // esse for busca por palavras palindromos
   #pragma omp parallel for private(c,cc,flag,palavra,aux_palin,aux_primo) schedule(static,10) shared(fp) reduction(+:count2)
   for(i=0;i<tamanho_arquivo;i++){           
             
       c = fgetc(fp);
       
       //apenas reconhecem palavras que possuem caracteres de 'a' a 'z' tanto maiusculo quanto minusculos          
       if(c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z'){
            cc[0] = c;
            cc[1] = '\0';
            strcat(palavra,cc);
            flag = 1;  
       }
       
       
       else {
            if(flag == 1){
   
                 //verifica se a palavra e um palindromo                 
                 aux_palin = palindromo(palavra);	
                
                 //se for palindromo
                 if(aux_palin == 1){

                      /*se a palavra for um palindromo, entao passa a verificar
                      se a soma dos caracteres e um numero primo */     
                      aux_primo = calcula_primo(palavra);
                     
                      //se for primo salva palavra em um arquivo e incrementa count
                      if(aux_primo == 1){
                          
                          count2++;
                          
                      }
                      
                 }
                 
                 //inicializa variaveis para proxima palavra a ser lida do arquivo
                 strcpy(palavra,"");
                 flag = 0;       
            }
            else
                /*caso contraio inicializamos a variavel palavra pra garantir concistencia
                no codigo */
                strcpy(palavra,"");
      
       }
   }
   
   //fecha arquivos
   fclose(fp);
   
   //imprime a quantida de palavra palindromos primos
   printf("\nPossui %d palavra palindromos e primo na soma dos caracteres da tabela ascii\n",count2);  
   
}


// calcula se a palavra e um palindromo
int palindromo(char *palavra){

    int i,tam;
    
    tam = strlen(palavra);
    
    //reconhecemos apenas palavras que seja maior que dois de numeros de caracteres
    if(tam <= 2)   return 0;
    
    for(i=0;i<tam;i++){
                   
         if(palavra[i] != palavra[tam-i-1])
              return 0;                       
    }
    
    return 1;
}

// calcula se a palavra e primo
int calcula_primo(char *palavra){

   int i,j,resto,tam_palavra,soma_ascii_palavra=0,aux;
   int parada,*vet_aux;
   int flag;
   
   // calcula o tanho da string
   tam_palavra = strlen(palavra);
   
   //printf("tam: %d  ",tam_palavra);
   
   //soma os valores de cada caracter da tabela ascii
   for(i=0; i<tam_palavra; i++)
            soma_ascii_palavra += palavra[i];      
            
   //printf("Palavra_asci: %d  ",soma_ascii_palavra);          
   
   /* podemos parar de riscar m?ltiplos quando chegamos na raiz quadrada 
   do n?mero m?ximo que estipulamos, no caso o valor da soma dos caracteres 
   da palavra */
   parada = sqrt(soma_ascii_palavra);

   // fazendo o crivo 
   for(i=2; i<=(parada); i++){
            
            resto = soma_ascii_palavra % i;
            
            if(resto == 0)
                     return 0;
   }
   
   return 1;
   
}


